package com.zjj.learn.javaplus.pkg04.demo401;

public class TestDemo401_3 {

    public static void main(String[] args) {
        boolean check1 = checkQQ("12534r");
        System.out.println("check1 = " + check1);

        boolean check2 = checkQQRegex("1253455222");
        System.out.println("check2 = " + check2);
    }


    /**
     * 用正则表达式
     **/
    public static boolean checkQQRegex(String QQ) {
        return QQ.matches("\\d{5,10}");
    }

    /**
     * 不使用正则表达式校验 QQ 号是否符合标准
     * 假设QQ号规则：
     * 1、首页不为 0 ；
     * 2、长度在 5 到 10 位
     * 3、全部都是有数字【0 - 9】组成
     **/
    public static boolean checkQQ(String QQ) {
        if (null == QQ) {
            return false;
        }
        int len = QQ.length();
        if (len < 5 || len > 10) {
            return false;
        }
        for (int i = 0; i < len; i++) {
            char c = QQ.charAt(i);
            if (c < '0' || c > '9') {
                return false;
            }
        }
        return true;
    }


    /**
     * 正则表达式的使用
     *  作用：是一些特殊字符组成的校验规则，可以校验信息的正确性，校验邮箱是否合法
     *       电话号码，金额等。
     *
     *      字符类
     *          [abc] a、b 或 c（简单类）
     *          [^abc] 任何字符，除了 a、b 或 c（否定）
     *          [a-zA-Z] a 到 z 或 A 到 Z，两头的字母包括在内（范围）
     *          [a-d[m-p]] a 到 d 或 m 到 p：[a-dm-p]（并集）
     *          [a-z&&[def23]] d、e 或 f（交集）
     *          [a-z&&[^bc]] a 到 z，除了 b 和 c：[ad-z]（减去）
     *          [a-z&&[^m-p]] a 到 z，而非 m 到 p：[a-lq-z]（减去）
     *
     *      预定义字符类
     *          . 任何字符
     *          \d 数字：[0-9]
     *          \D 非数字： [^0-9]
     *          \s 空白字符：[ \t\n\x0B\f\r]
     *          \S 非空白字符：[^\s]
     *          \w 单词字符：[a-zA-Z_0-9]
     *          \W 非单词字符：[^\w]
     *
     *     以上正则匹配只能校验单个字符。
     *
     *     Greedy 数量词
     *          X? X，一次或一次也没有
     *          X* X，零次或多次
     *          X+ X，一次或多次
     *          X{n} X，恰好 n 次
     *          X{n,} X，至少 n 次
     *          X{n,m} X，至少 n 次，但是不超过 m 次
     **/


}
